/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Estats;


import Efectos.ImageFxFadeInOut;
import newMenu.ManagerContext;
import newMenu.ManagerPerfil;
import newMenu.ManagerRecursos;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import org.newdawn.slick.state.transition.FadeInTransition;
import org.newdawn.slick.state.transition.FadeOutTransition;

/**
 * Introduccion del juego, serie de imagenes y una animacion
 * @author Raul Delgado y Xavier Pol
 */
public class EstatIntro extends BasicGameState {

    // Identificador del estat
    public static final int ID = 0;
    // Imatge del logo
    private Image imatgeIntro;
    // Imatge del logo
    private Image imatgeIntro2;
    // Imatge del logo
    private Image imatgeIntro3;
    // Efecte que s'usara per fer els canvis d'estat
    private ImageFxFadeInOut fxFadeInOutLogo;
    // Efecte que s'usara per fer els canvis d'estat
    private ImageFxFadeInOut fxFadeInOutLogo2;
    // Efecte que s'usara per fer els canvis d'estat
    private ImageFxFadeInOut fxFadeInOutLogo3;
    // Variable comptador que fara de "timer"
    private int comptador = 0;
    // Limit al que podra arribar la variable comptador
    private int limitComptador = 16000;
    //Imagen avion
    private Image avion;
    //Imagen avion eemigo
    private Image avionEnemigo;
    //Imagen disparo 1
    private Image disparo1;
    //Imagen disparo 2
    private Image disparo2;
    //Imagen disparo 3
    private Image disparo3;
    //Posicion  X avion
    private int posX;
    //Posicion Y avion
    private int posY;
    //Posicion  X avion enemigo
    private int posXE;
    //Posicion Y avion enemigo
    private int posYE;
    //Posicion  X disparo1
    private int posX1;
    //Posicion  X disparo2
    private int posX2;
    //Posicion  X disparo3
    private int posX3;
    //Avion en pantalla
    private boolean avionAp;
     // Sonido de los aviones en la intro
    protected Sound sonidoAvion;
    /**
     * BasicGameState ens obliga a implementar aquest metode
     * @return int amb l'ID de l'estat del joc
     */
    public int getID() {
        return ID;
    }

    /**
     * Aqui s'inicialitzen les variables necessaries per al correcte funcionament del estat
     * @param container
     * @param game
     * @throws SlickException
     */
    public void init(GameContainer container, StateBasedGame game)
            throws SlickException {
        ManagerContext.setGui(container);
        ManagerContext.setState(game);
        //Imagenes de fondo de la intro, iran apareciendo x tiempo cada una
        imatgeIntro = ManagerRecursos.getImage("fonsIntro1Image");
        imatgeIntro2 = ManagerRecursos.getImage("fonsIntro2Image");
        imatgeIntro3 = ManagerRecursos.getImage("fonsIntro3Image");
        //Animacion de la intro, esta animacion aparecera por encima de los fondos
        avion = ManagerRecursos.getImage("avionImage");
        avionEnemigo = ManagerRecursos.getImage("me163Image");
        disparo1 = ManagerRecursos.getImage("shotImage");
        disparo2 = ManagerRecursos.getImage("shotImage");
        disparo3 = ManagerRecursos.getImage("shotImage");
        //Posiciones inciales de los objetos de la animacion
        posX = -150;
        posY = 600;
        posX1 = 60;
        posX2 = 110;
        posX3 = 160;
        posXE = -150;
        posYE = 600;
        avionAp = false;
    }

    /**
     * El motor s'encarrega de cridar aquest metode, aqui s'actualitzaran dades de variables o objectes
     * que s'estiguin usant en aquest estat
     * @param container
     * @param game
     * @param delta
     * @throws SlickException
     */
    public void update(GameContainer container, StateBasedGame game, int delta)
            throws SlickException {
        fxFadeInOutLogo.update(delta);
        fxFadeInOutLogo2.update(delta);
        fxFadeInOutLogo3.update(delta);
        comptador += delta;
        // Si el contador llega al limite de tiempo o se presiona esc, se pasa al siguiente estate
        if (comptador > limitComptador || container.getInput().isKeyDown(Input.KEY_ESCAPE)) {
            game.enterState(EstatLoading.ID, new FadeOutTransition(), new FadeInTransition());
        }
        //No se mostrara el avion "bueno" hasta que el avion enemigo no este a una cierta distancia
        if (avionAp) {
            //Sonido avionsonidoAvion.play();
            //Velocidad del avion y de sus disparos
            posX+= 0.2f * delta;
            posX1 += 0.3 * delta;
            posX2 += 0.3 * delta;
            posX3 += 0.3 * delta;
        }
        //Velocidad avion enemigo
        posXE += 0.3f * delta;
        if (posXE > 300){
            avionAp = true;
        }
    }

    /**
     * Aquest metode s'usa per renderitzar o dibuixar en pantalla els elements que es vulguin
     * @param container
     * @param game
     * @param g
     * @throws SlickException
     */
    public void render(GameContainer container, StateBasedGame game, Graphics g)
            throws SlickException {
        fxFadeInOutLogo.render(container, g);
        //Se dibuja el avion enemigo
        avionEnemigo.draw(posXE, posYE);
        //Si el avion enemigo esta los uficientemente lejos, entonces aparece el avion aliado
        if (avionAp){
            avion.draw(posX, posY);
        }
        //Movimiento dipsaros
        if (posX > 100) {
            disparo1.draw(posX1 - 150, posY+60);
        }
        if (posX > 150) {
            disparo2.draw(posX2 - 150, posY + 60);
        }
        if (posX > 200) {
            disparo2.draw(posX3 -150 , posY + 60);
        }
        fxFadeInOutLogo2.render(container, g);
        fxFadeInOutLogo3.render(container, g);
    }

    /**
     * Es fa un override del metode enter, el qual es crida cada vegada que s'entra a l'estat
     * @param gc : context on es situa l'estat actual
     * @param state : estat actual
     */
    @Override
    public void enter(GameContainer gc, StateBasedGame state) {
        //Imagen intro 1, durante 10 segundos
        fxFadeInOutLogo = new ImageFxFadeInOut(gc, imatgeIntro, 0, 0, 48, 51, 0, 10000);
        //Imagen intro 2, durante 10 segundos
        fxFadeInOutLogo2 = new ImageFxFadeInOut(gc, imatgeIntro2, 0, 0, 48, 51, 9000, 10000);
        //Imagen intro 3, durante 10 segundos
        fxFadeInOutLogo3 = new ImageFxFadeInOut(gc, imatgeIntro3, 0, 0, 48, 51, 18000, 10000);
    }
}


